//
//  JKXML.m
//  JKXML
//
//  Created by 王冲 on 2019/1/25.
//  Copyright © 2019年 JK科技有限公司. All rights reserved.
//

#import "JKXML.h"
#import "VideoModel.h"
@interface JKXML()<NSXMLParserDelegate>

// 1.解析后的video数组
@property(nonatomic,strong) NSMutableArray *dataArray;
// 2.当前解析的节点模型
@property(nonatomic,strong) VideoModel *videoModel;
// 3.拼接字符串--可变字符串
@property(nonatomic,strong) NSMutableString *elementStr;


@end
@implementation JKXML

-(NSArray *)jk_parseXMLData:(NSData *)data{
    
    // 3.1、xml解析是一个复杂的操作
    NSXMLParser * parser = [[NSXMLParser alloc]initWithData:data];
    // 3.2、设置代理，一旦解析器开始解析，后续的工作就会由代理来监听
    parser.delegate = self;
    // 3.3、解析器解析 //这个方法会卡住（同步解析，解析完毕后才会返回）
    [parser parse];
    // 3.4、返回解析后的数组
    return self.dataArray;
    
}

#pragma mark XML <解析的5个代理>
// 1.打开文档
-(void)parserDidStartDocument:(NSXMLParser *)parser{
    
    // 清空数组
    [self.dataArray removeAllObjects];
}
// 2.开始节点
/**
 开始节点
 
 @param parser NSXMLParser对象
 @param elementName 节点名称
 @param namespaceURI 命名空间
 @param qName 命名空间限定的本地名称
 @param attributeDict 属性
 */
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict{
    
    // NSLog(@"开始节点：%@\n属性=%@",elementName,attributeDict);
    
    if ([elementName isEqualToString:@"video"]) {
        
        // 1.新建模型
        self.videoModel = [[VideoModel alloc]init];
        
        // 2.设置videoID的属性
        self.videoModel.videoId = @([attributeDict[@"videoId"]intValue]);
    }
    
}
// 3.发现节点内容(一个节点会被读取多次)
-(void)parser:(NSXMLParser *)parser foundCharacters:(nonnull NSString *)string{
    
    // NSLog(@"节点内容=%@",string);
    // 拼接字符串
    [self.elementStr appendString:string];
}
// 4.结束节点
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
    
    // NSLog(@"结束节点：%@",elementName);
    if ([elementName isEqualToString:@"video"]) {
        // 大节点分割模型
        [self.dataArray addObject:self.videoModel];
    }else if(![elementName isEqualToString:@"videos"]){
        
        NSLog(@"key=%@ value=%@",elementName,self.elementStr);
        // 小节点设置值
        [self.videoModel setValue:self.elementStr forKey:elementName];
    }
    
    // 清空节点内容
    [self.elementStr setString:@""];
}
// 5.结束解析
-(void)parserDidEndDocument:(NSXMLParser *)parser{
    
    // 更新UI,通知一下要做的操作！
    NSLog(@"结束解析 %@",self.dataArray);
}
// 6.出现错误(主要是网络开发，就需要对出错进行处理)
-(void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError{
    
    NSLog(@"发生错误=%@",parseError);
}


-(NSMutableString *)elementStr
{
    if (!_elementStr) {
        _elementStr = [[NSMutableString alloc]init];
    }
    return _elementStr;
}

-(NSMutableArray *)dataArray
{
    if (!_dataArray) {
        _dataArray = [[NSMutableArray alloc]init];
    }
    return _dataArray;
}

@end
